package com.blobfish.run;

import org.beetl.ext.jfinal.BeetlRenderFactory;

import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.wall.WallConfig;
import com.alibaba.druid.wall.WallFilter;
import com.blobfish.constant.ConstantInit;
import com.blobfish.dto.DataBase;
import com.blobfish.model._MappingKit;
import com.blobfish.mvc.login.LoginController;
import com.blobfish.tools.ToolBeetl;
import com.blobfish.tools.ToolDataBase;
import com.jfinal.config.Constants;
import com.jfinal.config.Handlers;
import com.jfinal.config.Interceptors;
import com.jfinal.config.JFinalConfig;
import com.jfinal.config.Plugins;
import com.jfinal.config.Routes;
import com.jfinal.core.JFinal;
import com.jfinal.kit.PropKit;
import com.jfinal.log.Log;
import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
import com.jfinal.plugin.activerecord.CaseInsensitiveContainerFactory;
import com.jfinal.plugin.activerecord.dialect.AnsiSqlDialect;
import com.jfinal.plugin.activerecord.dialect.MysqlDialect;
import com.jfinal.plugin.activerecord.dialect.OracleDialect;
import com.jfinal.plugin.activerecord.dialect.PostgreSqlDialect;
import com.jfinal.plugin.activerecord.dialect.SqlServerDialect;
import com.jfinal.plugin.druid.DruidPlugin;

/**
 * API引导式配置
 */
public class DemoConfig extends JFinalConfig {

	private static final Log log = Log.getLog(DemoConfig.class);

	/**
	 * 配置常量
	 */
	public void configConstant(Constants me) {
		// 加载少量必要配置，随后可用PropKit.get(...)获取值
		PropKit.use("a_little_config.properties");
		me.setDevMode(PropKit.getBoolean(ConstantInit.config_devMode, false));

		me.setMainRenderFactory(new BeetlRenderFactory());
		ToolBeetl.register();

		me.setError404View("common/404.html");

	}

	/**
	 * 配置路由
	 */
	public void configRoute(Routes me) {
		me.add("/login", LoginController.class);
	}

	public static DruidPlugin createDruidPlugin() {
		DataBase db = ToolDataBase.getDbInfo();
		DruidPlugin druidPlugin = new DruidPlugin(db.getJdbcUrl(), db.getUserName(), db.getPassWord(),
				db.getDriverClass());

		log.info("DemoConfig 配置Druid数据库连接池的大小");
		druidPlugin.set(PropKit.getInt(ConstantInit.db_initialSize), PropKit.getInt(ConstantInit.db_minIdle),
				PropKit.getInt(ConstantInit.db_maxActive));
		log.info("DemoConfig 配置Druid数据库连接池过滤器配置");
		druidPlugin.addFilter(new StatFilter());
		WallFilter wall = new WallFilter();
		wall.setDbType(PropKit.get(ConstantInit.db_type_key));
		WallConfig config = new WallConfig();
		config.setFunctionCheck(false);// 支持数据库函数
		wall.setConfig(config);
		druidPlugin.addFilter(wall);
		return druidPlugin;
	}

	/**
	 * 配置插件
	 */
	public void configPlugin(Plugins me) {
		// 配置C3p0数据库连接池插件
		DruidPlugin druidPlugin = createDruidPlugin();
		me.add(druidPlugin);

		// 配置ActiveRecord插件
		ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
		boolean devModel = Boolean.parseBoolean(PropKit.get(ConstantInit.config_devMode));
		arp.setDevMode(devModel);// 设置开发者模式
		arp.setShowSql(devModel);// 设置是否显示sql
		arp.setContainerFactory(new CaseInsensitiveContainerFactory(true));// 大小写不敏感

		log.info("demoPlugun 数据库类型判断");
		String db_type = PropKit.get(ConstantInit.db_type_key);
		if (db_type.equals(ConstantInit.db_type_postgresql)) {
			log.info("demoConfig 使用的数据库类型是postgresql");
			arp.setDialect(new PostgreSqlDialect());
		} else if (db_type.equals(ConstantInit.db_type_mysql)) {
			log.info("demoConfig 使用的数据库类型是mysql");
			arp.setDialect(new MysqlDialect());
		} else if (db_type.equals(ConstantInit.db_type_oracle)) {
			log.info("demoConfig 使用的数据库类型是oracle");
			arp.setDialect(new OracleDialect());
		} else if (db_type.equals(ConstantInit.db_type_sqlserver)) {
			log.info("demoConfig 使用的数据库类型是sqlserver");
			druidPlugin.setValidationQuery("select 1 FROM DUAL"); // 指定连接验证语句
			arp.setDialect(new SqlServerDialect());
		} else if (db_type.equals(ConstantInit.db_type_db2)) {
			log.info("demoConfig 使用的数据库类型是db2");
			druidPlugin.setValidationQuery("select 1 from sysibm.sysdummy1"); // 连接验证语句
			arp.setDialect(new AnsiSqlDialect());
		}

		me.add(arp);

		// 所有配置在 MappingKit 中搞定
		_MappingKit.mapping(arp);
	}

	/**
	 * 配置全局拦截器
	 */
	public void configInterceptor(Interceptors me) {

	}

	/**
	 * 配置处理器
	 */
	public void configHandler(Handlers me) {

	}

	/**
	 * 建议使用 JFinal 手册推荐的方式启动项目 运行此 main
	 * 方法可以启动项目，此main方法可以放置在任意的Class类定义中，不一定要放于此
	 */
	public static void main(String[] args) {
		JFinal.start("WebRoot", 80, "/", 5);
	}
}
